home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Shareware World / Comms & Internet / HTML and CSS modes / HTML and CSS Modes / htmlMenu.tcl < prev    next >
Text File  |  1998-11-01  |  25KB  |  737 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode - tools for editing HTML documents
  4.  # 
  5.  #  FILE: "htmlMenu.tcl"
  6.  #                                    created: 96-04-29 21.31.40 
  7.  #                                last update: 98-11-01 17.00.28 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jl@theophys.kth.se>
  10.  #     www: <http://bach.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.1.3
  13.  # 
  14.  # Copyright 1996-1998 by Johan Linde
  15.  #  
  16.  # This software may be used freely, and distributed freely, as long as the 
  17.  # receiver is not obligated in any way by receiving it.
  18.  #  
  19.  # If you make improvements to this file, please share them!
  20.  # 
  21.  # ###################################################################
  22.  ##
  23.  
  24. proc htmlMenu.tcl {} {}
  25.  
  26. proc htmlMarkExtUtil {} {
  27.     global htmlUtilsMenu htmlElemKeyBinding htmlAdditionExist htmlShownWarning
  28.     enableMenuItem $htmlUtilsMenu Extend [expr ![info exists htmlShownWarning]]
  29.     htmlEnableExtend [info exists htmlElemKeyBinding] $htmlAdditionExist
  30. }
  31.  
  32. proc htmlHide {} {
  33.     htmlDisableSome on
  34.     htmlSetDis
  35.     htmlDisableSome off
  36. }
  37.  
  38. # Disable some HTML elements    
  39. proc htmlDisableSome {onoff} {
  40.     global htmlElemKeyBinding htmlDisabledItems htmlMenu
  41.     foreach i $htmlDisabledItems {
  42.         set it [split $i /]
  43.         enableMenuItem [lindex $it 0] [lindex $it 1] $onoff
  44.     }
  45. }
  46.  
  47. proc htmlUseBigBrother {} {
  48.     global HTMLmodeVars modifiedModeVars
  49.     set HTMLmodeVars(useBigBrother) [expr !$HTMLmodeVars(useBigBrother)]
  50.     if {[catch {nameFromAppl Bbth}]} {
  51.         set HTMLmodeVars(useBigBrother) 0
  52.         enableMenuItem {Check Links} {Use Big Brother} off
  53.     }
  54.     markMenuItem -m {Check Links} {Use Big Brother} $HTMLmodeVars(useBigBrother) 
  55.     lappend modifiedModeVars {useBigBrother HTMLmodeVars}
  56.     message "[lindex {"Don't use" Use} [set HTMLmodeVars(useBigBrother)]] Big Brother."
  57. }
  58.  
  59. # Called from HTML menu to change browser.
  60. proc htmlToggleBrowser {brws} {
  61.     global htmlBrowsers browserSig modifiedVars
  62.     foreach b $htmlBrowsers {
  63.         if {$brws == [lindex $b 1]} {set browserSig [lindex $b 0]}
  64.     }
  65.     lappend modifiedVars browserSig
  66.     if {![key::optionPressed]} {htmlSendWindow}
  67. }
  68.  
  69. # Called whenever browserSig is changed.
  70. proc htmlToggleBrowser2 {args} {
  71.     global browserSig htmlBrowsers HTMLmodeVars
  72.     if {[lsearch -exact $HTMLmodeVars(browsers) $browserSig] < 0} {htmlAddBrowser $browserSig}
  73.     foreach b $htmlBrowsers {
  74.         if {$browserSig == [lindex $b 0]} {
  75.             markMenuItem -m Browsers [lindex $b 1] on 
  76.         } else {
  77.             markMenuItem -m Browsers [lindex $b 1] off
  78.         }
  79.     }
  80. }
  81.  
  82. # Add a browser to Browser menu.
  83. proc htmlAddBrowser {{sig ""}} {
  84.     global htmlBrowsers HTMLmodeVars modifiedModeVars browserSig
  85.     if {$sig == ""} {
  86.         set fil [getfile "Locate a web browser."]
  87.         set sig [getFileSig $fil]
  88.     }
  89.     if {[catch {nameFromAppl $sig} fil]} {
  90.         alertnote "Couldn't get the name of the browser. If nothing else helps try rebuilding the desktop."
  91.         return
  92.     }
  93.     if {[lsearch -exact $HTMLmodeVars(browsers) $sig] >= 0} {return}
  94.     lappend HTMLmodeVars(browsers) $sig
  95.     lappend modifiedModeVars {browsers HTMLmodeVars}
  96.     lappend htmlBrowsers [list $sig [set app [file tail $fil]]]
  97.     htmlAddBrowserItem $app $sig
  98.     if {$sig == $browserSig} {markMenuItem -m "Browsers" $app on }
  99.     message "$app added to Browsers menu."
  100. }
  101.  
  102. # Remove a browser from Browser menu.
  103. proc htmlRemoveBrowser {} {
  104.     global htmlBrowsers HTMLmodeVars modifiedModeVars browserSig modifiedVars
  105.     foreach b $htmlBrowsers {
  106.         lappend tmp [lindex $b 1]
  107.     }
  108.     if {[catch {listpick -p "Select browser to remove" $tmp} brws] || $brws == ""} {return}
  109.     for {set i 0} {$i < [llength $htmlBrowsers]} {incr i} {
  110.         if {$brws == [lindex [lindex $htmlBrowsers $i] 1]} {
  111.             deleteMenuItem -m Browsers $brws
  112.             if {[lindex $HTMLmodeVars(browsers) $i] == $browserSig} {
  113.                 set j 0
  114.                 if {$i == 0} {incr j}
  115.                 if {$j < [llength $HTMLmodeVars(browsers)]} {set browserSig [lindex $HTMLmodeVars(browsers) $j]}
  116.                 lappend modifiedVars browserSig
  117.             }
  118.             set htmlBrowsers [lreplace $htmlBrowsers $i $i]
  119.             set HTMLmodeVars(browsers) [lreplace $HTMLmodeVars(browsers) $i $i] 
  120.         }
  121.     }
  122.     lappend modifiedModeVars {browsers HTMLmodeVars}
  123.     message "$brws removed from Browsers menu."
  124. }
  125.  
  126. proc htmlAddBrowserItem {app sig} {
  127.     switch $sig {
  128.         MOSS {
  129.             if {[string match "*Navigator*" $app]} {
  130.                 set ic 85
  131.             } else {
  132.                 set ic 86
  133.             }
  134.         }
  135.         MSIE {set ic 87}
  136.         OlG1 {set ic 88}
  137.         dogz {set ic 73}
  138.         default {set ic 78}
  139.     }
  140.     addMenuItem -m Browsers [menu::itemWithIcon $app $ic]
  141. }
  142.  
  143.  
  144. proc htmlEnableURLs {onoff} {
  145.     enableMenuItem URLs "Clean Up…" $onoff
  146.     enableMenuItem URLs "Clear" $onoff
  147.     enableMenuItem URLs "Export…" $onoff
  148. }
  149.  
  150. proc htmlEnablewindows {onoff} {
  151.     global htmlUtilsMenu
  152.     enableMenuItem $htmlUtilsMenu Windows $onoff
  153. }
  154.  
  155. proc htmlEnableExtend {a b} {
  156.     enableMenuItem Extend "Change Key Binding…" $a
  157.     enableMenuItem Extend "Change Type and Layout…" $a
  158.     enableMenuItem Extend "Remove Attributes…" $b
  159.     enableMenuItem Extend "Remove Additions…" $b
  160. }
  161.  
  162. proc htmlActivateHook {args} {
  163.     global htmlHideDeprecated htmlHideExtensions htmlHideFrames
  164.     set htmlHideExtensions 0
  165.     set htmlHideDeprecated 0
  166.     set htmlHideFrames 0
  167.     set doc [htmlFindDoctype]
  168.     if {$doc == "transitional" || $doc == "frameset"} {
  169.         set htmlHideExtensions 1
  170.         if {$doc == "transitional"} {set htmlHideFrames 1}
  171.     } elseif {$doc == "strict"} {
  172.         set htmlHideDeprecated 1
  173.     }
  174.     htmlHide
  175. }
  176.  
  177. proc htmlFindDoctype {} {
  178.     if {![catch {search -s -f 1 -r 1 -i 1 -m 0 {<!doctype[^<>]+html[ \t\r\n]+4.0[ \t\r\n]+transitional[^<>]+>} 0}]} {
  179.         return transitional
  180.     } elseif {![catch {search -s -f 1 -r 1 -i 1 -m 0 {<!doctype[^<>]+html[ \t\r\n]+4.0[ \t\r\n]+frameset[^<>]+>} 0}]} {
  181.         return frameset
  182.     } elseif {![catch {search -s -f 1 -r 1 -i 1 -m 0 {<!doctype[^<>]+html[ \t\r\n]+4.0[ \t\r\n]*//[^<>]+>} 0}]} {
  183.         return strict
  184.     }
  185.     return ""
  186. }
  187.  
  188. #===============================================================================
  189. # Menu Processing
  190. #===============================================================================
  191.  
  192. proc htmlMenuItem {menu item} {
  193.     global htmlElemProc htmlDisabledItems
  194.     global screenWidth defWidth
  195.  
  196.     foreach it $htmlDisabledItems {
  197.         if {[lindex [split $it /] 1] == $menu || "${menu}/$item" == $it} {beep; return}
  198.     }
  199.     
  200.     switch -glob $menu {
  201.         "•*" {eval html[join $item ""]}
  202.         "Browsers" {
  203.             switch $item {
  204.                 "Send File to Browser"    {htmlSendWindow}
  205.                 "Add"    {htmlAddBrowser}
  206.                 "Remove" {htmlRemoveBrowser}
  207.                 default {htmlToggleBrowser $item}
  208.             }
  209.         }
  210.         "Preferences" {HTMLmodifyFlags [lindex $item 0]}
  211.         "Palettes" {float -m "$item" -t 50 -l [expr $screenWidth - $defWidth > 110 ? $defWidth : $screenWidth - 110] -z HTML} 
  212.         "Editing" {eval html[join $item ""]}
  213.         "Validate" {eval html[join $item ""]}
  214.         "Character Translation"    {
  215.             switch $item {
  216.                 "åäö -> HTML"        {htmlCharacterstohtml 0}
  217.                 "HTML -> åäö"    {htmltoCharacters 0}
  218.                 "<>& -> HTML"    {htmlCharacterstohtml 1}
  219.                 "HTML -> <>&"    {htmltoCharacters 1}
  220.                 default {eval html[join $item ""]}
  221.             }
  222.         }
  223.         "URLs"    {
  224.             switch $item {
  225.                 "Clean Up"        {htmlCleanUpCache URLs}
  226.                 "Clear"            {htmlClearCache URLs}
  227.                 default {eval html[join $item ""]}
  228.             }
  229.         }
  230.         "Windows"    {
  231.             switch $item {
  232.                 "Clean Up"    {htmlCleanUpCache windows}
  233.                 "Clear"        {htmlClearCache windows}
  234.                 default {eval html[join $item ""]}
  235.             }
  236.         }
  237.         "Check Links" {eval html[join $item ""]}
  238.         "Includes" {eval html[join $item ""]}
  239.         "Home Page Windows" {
  240.             switch $item {
  241.                 "Open" {htmlOpenHPwin}
  242.                 default {eval html[join $item ""]}
  243.             }
  244.         }
  245.         "Extend" {eval html[join $item ""]}
  246.         "Style Sheets" {
  247.             switch $item {
  248.                 Style {htmlTag {htmlBuildCR2Elem STYLE}}
  249.                 Span {htmlTag {htmlBuildElem SPAN}}
  250.                 Import {cssDialog @import}
  251.                 Display {cssDialog Display}
  252.                 default {
  253.                     if {[info commands html[join $item ""]] != ""} {
  254.                         eval html[join $item ""]
  255.                     } else {
  256.                         cssDialog [join [string tolower $item] -]}
  257.                     }
  258.             }
  259.         }
  260.         "Headers" {
  261.             switch $item {
  262.                 "Header1"    {htmlTag {htmlBuildCRElem H1 1}}
  263.                 "H1 no attr" {htmlTag {htmlBuildCRElem H1 1 NOATTR}}
  264.                 "Header2"    {htmlTag {htmlBuildCRElem H2 1}}
  265.                 "H2 no attr" {htmlTag {htmlBuildCRElem H2 1 NOATTR}}
  266.                 "Header3"    {htmlTag {htmlBuildCRElem H3 1}}
  267.                 "H3 no attr" {htmlTag {htmlBuildCRElem H3 1 NOATTR}}
  268.                 "Header4"    {htmlTag {htmlBuildCRElem H4 1}}
  269.                 "H4 no attr" {htmlTag {htmlBuildCRElem H4 1 NOATTR}}
  270.                 "Header5"    {htmlTag {htmlBuildCRElem H5 1}}
  271.                 "H5 no attr" {htmlTag {htmlBuildCRElem H5 1 NOATTR}}
  272.                 "Header6"    {htmlTag {htmlBuildCRElem H6 1}}
  273.                 "H6 no attr" {htmlTag {htmlBuildCRElem H6 1 NOATTR}}
  274.                 default {eval html[join $item ""]}
  275.             }
  276.         }
  277.         "Blocks and Dividers" {
  278.             switch $item {
  279.                 "Paragraph"    {htmlElemParagraph}
  280.                 "P no attr" {htmlElemParagraph NOATTR}
  281.                 "Division"        {htmlTag {htmlBuildCR2Elem DIV}}
  282.                 "Block Quote"    {htmlTag {htmlBuildCR2Elem BLOCKQUOTE}}
  283.                 "Address"        {htmlTag {htmlBuildCRElem ADDRESS}}
  284.                 "Center"        {htmlTag {htmlBuildCR2Elem CENTER}}
  285.                 "Preformatted"    {htmlTag {htmlBuildCR2Elem PRE}}
  286.                 "Multi Column"    {htmlTag {htmlBuildCR2Elem MULTICOL}}
  287.                 "Spacing"        {htmlTag {htmlBuildOpening SPACER}}
  288.                 "Direction Override" {htmlTag {htmlBuildCRElem BDO}}
  289.                 "Inserted Text"    {htmlTag {htmlBuildCRElem INS}}
  290.                 "Deleted Text"    {htmlTag {htmlBuildCRElem DEL}}
  291.                 "Line Break"        {htmlTag {htmlBuildOpening BR 0 1}}
  292.                 "BR no attr"        {htmlTag {htmlBuildOpening BR 0 1 NOATTR}}
  293.                 "Horizontal Rule"    {htmlTag {htmlBuildOpening HR 1 1}}
  294.                 "HR no attr"    {htmlTag {htmlBuildOpening HR 1 1 NOATTR}}
  295.                 "No Line Break"    {htmlTag {htmlBuildElem NOBR}}
  296.                 "Word Break"    {htmlTag {htmlBuildOpening WBR 0 1}}
  297.                 default {eval html[join $item ""]}
  298.             }
  299.         }
  300.         "Styles"    {
  301.             switch $item {
  302.                 "Font"            {htmlTag {htmlBuildElem FONT}}
  303.                 "Basefont"        {htmlTag {htmlBuildOpening BASEFONT 1 1}}
  304.                 "Marquee"        {htmlTag {htmlBuildCRElem MARQUEE}}
  305.                 "Bold"            {htmlTag {htmlBuildElem B}}
  306.                 "Italic"        {htmlTag {htmlBuildElem I}}
  307.                 "Strike out"    {htmlTag {htmlBuildElem STRIKE}}
  308.                 "Underlined"    {htmlTag {htmlBuildElem U}}
  309.                 "Subscript"        {htmlTag {htmlBuildElem SUB}}
  310.                 "Superscript"    {htmlTag {htmlBuildElem SUP}}
  311.                 "Bigger"        {htmlTag {htmlBuildElem BIG}}
  312.                 "Smaller"        {htmlTag {htmlBuildElem SMALL}}
  313.                 "Emphasis"        {htmlTag {htmlBuildElem EM}}
  314.                 "Strong"        {htmlTag {htmlBuildElem STRONG}}
  315.                 "Definition"    {htmlTag {htmlBuildElem DFN}}
  316.                 "Code"            {htmlTag {htmlBuildElem CODE}}
  317.                 "Variable"        {htmlTag {htmlBuildElem VAR}}
  318.                 "Citation"        {htmlTag {htmlBuildElem CITE}}
  319.                 "Keyboard"        {htmlTag {htmlBuildElem KBD}}
  320.                 "Typewriter"    {htmlTag {htmlBuildElem TT}}
  321.                 "Sample"        {htmlTag {htmlBuildElem SAMP}}
  322.                 "Blinking"        {htmlTag {htmlBuildElem BLINK}}
  323.                 "Quotation"        {htmlTag {htmlBuildElem Q}}
  324.                 "Abbreviation"    {htmlTag {htmlBuildElem ABBR}}
  325.                 "Acronym"        {htmlTag {htmlBuildElem ACRONYM}}
  326.                 default {eval html[join $item ""]}
  327.             }
  328.         }
  329.         "Links"    {
  330.             switch $item {
  331.                 "Link or Anchor" {htmlTag {htmlBuildElem A}}
  332.                 "Image"    {htmlTag {htmlBuildOpening IMG}}
  333.                 Object {htmlTag {htmlBuildCR2Elem OBJECT}}
  334.                 Sound {htmlTag {htmlBuildOpening BGSOUND 1 1}}
  335.                 default {eval html[join $item ""]}
  336.             }
  337.         }
  338.         "Plug-ins" {
  339.             switch $item {
  340.                 "General" {htmlTag {htmlBuildOpening EMBED}}
  341.                 "LiveAudio" {htmlTag {htmlBuildOpening EMBED 0 0 LIVEAUDIO}}
  342.                 "LiveVideo" {htmlTag {htmlBuildOpening EMBED 0 0 LIVEVIDEO}}
  343.                 "QuickTime Movie" {htmlTag {htmlBuildOpening EMBED 0 0 "QUICKTIME MOVIE"}}
  344.                 "QuickTime VR" {htmlTag {htmlBuildOpening EMBED 0 0 "QUICKTIME VR"}}
  345.                 "RealAudio"    {htmlTag {htmlBuildOpening EMBED 0 0 REALAUDIO}}
  346.                 "No Embed" {htmlTag {htmlBuildCR2Elem NOEMBED}}
  347.                 default {eval html[join $item ""]}
  348.             }
  349.         }
  350.         "Lists"    {
  351.             switch $item {
  352.                 "Bulleted"    {htmlTag {htmlBuildList UL "LI IN UL" UL}}
  353.                 "UL no attr"    {htmlTag {htmlBuildList UL NOATTR NOATTR}}
  354.                 "New Bulleted Item" {htmlTag {htmlBuildListEntry "LI IN UL"}}
  355.                 "Numbered"    {htmlTag {htmlBuildList OL "LI IN OL" OL}}
  356.                 "OL no attr"    {htmlTag {htmlBuildList OL NOATTR NOATTR}}
  357.                 "New Numbered Item" {htmlTag {htmlBuildListEntry "LI IN OL"}}
  358.                 "Directory"    {htmlTag {htmlBuildList DIR LI}}
  359.                 "Menu"        {htmlTag {htmlBuildList MENU LI}}
  360.                 "New List Item"    {htmlTag {htmlBuildListEntry LI}}
  361.                 "Discursive"    {htmlTag {htmlBuildList DL}}
  362.                 default {eval html[join $item ""]}
  363.             }
  364.         }
  365.         "Forms" {
  366.             switch $item {
  367.                 "Form"        {htmlTag {htmlBuildCR2Elem FORM}}
  368.                 "Field Set" {htmlTag {htmlBuildCR2Elem FIELDSET}}
  369.                 "Legend"    {htmlTag {htmlBuildCRElem LEGEND}}
  370.                 "Label"        {htmlTag {htmlBuildElem LABEL}}
  371.                 "Text"        {htmlTag {htmlBuildInputElem TEXT}}
  372.                 "Checkbox"    {htmlTag {htmlBuildInputElem CHECKBOX}}
  373.                 "Input Button"    {htmlTag {htmlBuildInputElem BUTTON}}
  374.                 "Radio"        {htmlTag {htmlBuildInputElem RADIO}}
  375.                 "Submit"        {htmlTag {htmlBuildInputElem SUBMIT}}
  376.                 "Reset"        {htmlTag {htmlBuildInputElem RESET}}
  377.                 "Password"    {htmlTag {htmlBuildInputElem PASSWORD}}
  378.                 "Hidden"        {htmlTag {htmlBuildInputElem HIDDEN}}
  379.                 "Image"        {htmlTag {htmlBuildInputElem IMAGE}}
  380.                 "File Upload" {htmlTag {htmlBuildInputElem FILE}}
  381.                 "Button"    {htmlTag {htmlBuildCRElem BUTTON}}
  382.                 "Select"        {htmlTag {htmlBuildCR2Elem SELECT}}
  383.                 "Option Group" {htmlTag {htmlBuildCR2Elem OPTGROUP}}
  384.                 "Option"        {htmlTag {htmlBuildOpening OPTION 1}}
  385.                 "Textarea"    {htmlTag {htmlBuildCRElem TEXTAREA}}
  386.                 "Key Generator" {htmlTag {htmlBuildOpening KEYGEN 1 1}}
  387.                 default {eval html[join $item ""]}
  388.             }
  389.         }
  390.         "Tables" {
  391.             switch $item {
  392.                 Table    {htmlTag {htmlBuildCR2Elem TABLE}}
  393.                 Row        {htmlTag {htmlBuildCR2Elem TR}}
  394.                 "TR no attr"        {htmlTag {htmlBuildCR2Elem TR NOATTR}}
  395.                 Header        {htmlTag {htmlBuildElem TH}}
  396.                 "TH no attr"        {htmlTag {htmlBuildElem TH NOATTR}}
  397.                 Cell        {htmlTag {htmlBuildElem TD}}
  398.                 "TD no attr"        {htmlTag {htmlBuildElem TD NOATTR}}
  399.                 Caption    {htmlTag {htmlBuildCRElem CAPTION}}
  400.                 Head {htmlTag {htmlBuildOpening THEAD 1 1}}
  401.                 Body {htmlTag {htmlBuildOpening TBODY 1 1}}
  402.                 Foot {htmlTag {htmlBuildOpening TFOOT 1 1}}
  403.                 "Column Group" {htmlTag {htmlBuildOpening COLGROUP 1 1}}
  404.                 Column {htmlTag {htmlBuildOpening COL 1 1}}
  405.                 default {eval html[join $item ""]}
  406.             }
  407.         }
  408.         "Frames" {
  409.             switch $item {
  410.                 Frameset        {htmlTag {htmlBuildCR2Elem FRAMESET}}
  411.                 Frame        {htmlTag {htmlBuildOpening FRAME 1 1}}
  412.                 "Inline Frame" {htmlTag {htmlBuildElem IFRAME}}
  413.                 "No Frames"    {htmlTag {htmlBuildCR2Elem NOFRAMES}}
  414.                 default {eval html[join $item ""]}
  415.             }
  416.         }
  417.         "Image Maps" {
  418.             switch $item {
  419.                 Map        {htmlTag {htmlBuildCR2Elem MAP}}
  420.                 Area    {htmlTag {htmlBuildOpening AREA 1 1}}
  421.                 default {eval html[join $item ""]}
  422.             }
  423.         }
  424.         "Java and JavaScript"    {
  425.             switch $item {
  426.                 Applet    {htmlTag {htmlBuildCR2Elem APPLET}}
  427.                 Parameter {htmlTag {htmlBuildOpening PARAM 1 1}}
  428.                 Script    {htmlTag {htmlBuildCR2Elem SCRIPT}}
  429.                 "No Script" {htmlTag {htmlBuildCR2Elem NOSCRIPT}}
  430.                 Server {htmlTag {htmlBuildCR2Elem SERVER}}
  431.                 default {eval html[join $item ""]}
  432.             }
  433.         }
  434.         "Layers" {
  435.             switch $item {
  436.                 Layer {htmlTag {htmlBuildCR2Elem LAYER}}
  437.                 "Inline Layer" {htmlTag {htmlBuildCRElem ILAYER}}
  438.                 "No Layer" {htmlTag {htmlBuildCR2Elem NOLAYER}}
  439.                 default {eval html[join $item ""]}
  440.             }
  441.         }
  442.         "Other"    {
  443.             switch $item {
  444.                 "Base"    {htmlTag {htmlBuildOpening BASE 1 1}}
  445.                 "Isindex" {htmlTag {htmlBuildOpening ISINDEX 1 1}}
  446.                 "Link"    {htmlTag {htmlBuildOpening LINK 1 1}}
  447.                 "Meta"    {htmlTag {htmlBuildOpening META 1 1}}
  448.                 default {eval html[join $item ""]}
  449.             }
  450.         }
  451.         "Character Entities"    {
  452.             switch $item {
  453.                 "Add"    {htmlAddCommonChars}
  454.                 "Default" {htmlDefaultCommonChars}
  455.                 "Clear"    {htmlClearCommonChars}
  456.                 default        {htmlInsertCharacter $item}
  457.             }
  458.         }
  459.         "*Chars*" {
  460.             htmlInsertCharacter $item
  461.         }
  462.         "Custom"    {
  463.             htmlTag $htmlElemProc([string toupper $item])
  464.         }
  465.     }
  466. }
  467.  
  468.  
  469. # Variables defining the sub menus. More variables in hctsmslMenu.tcl
  470.  
  471. set htmlHTMLSub {{"<I/t" "Help"} {"<B/m" "Use Attributes…"} {"<U<O/N" "New Document…"}}
  472.  
  473. set htmlBrowsersSub {{"<U<O/S" "Send File to Browser"} "(-" {"" "Add…"} {"" "Remove…"} "(-"}
  474.  
  475. set htmlPreferencesSub {{"" "General…"} {"" "Attributes…"} {"" "Indentation…"} {"" "JavaScript and CSS…"}
  476.     {"" "Checking Links…"} {"" "Word Wrapping…"}}
  477.     
  478. set htmlUtilitiesSub {{"" "Colors…"} {"" "Home Pages…"} {"" "Footers…"} {"" "Key Bindings…"}
  479.     {"<O/I" "Reformat Paragraph/Reformat Document"} {"" "Save to FTP Server/Forget Passwords"} 
  480.     {"" "Move Files…"} {"" "Last Modified…"} {"" "Document Type…"} {"" "Document Size"} 
  481.     {"" "Document Index…"}}
  482.  
  483. set htmlEditingSub {{"<O/B" "Select Container/Select Opening"}
  484.     {"<U<O/B" "Select in Container"}
  485.     {"<B/e" "Untag/Untag and Select"} {"<B/f" "Remove Opening"}
  486.     {"<B/g" "Change Container…/Change Opening…"} {"<B/h" "Change Choice"}
  487.     {"<B/i" "Reveal Color"} {"<B/j" "Insert Attributes"} {"" "Quote All Attributes"}
  488.     {"" "Tags to Uppercase/Tags to Lowercase"} {"" "Remove Tags"}}
  489.  
  490. set htmlValidateSub {{"" "Find Unbalanced Tags"} {"" "Check Tags"}}
  491.  
  492. set htmlCharacterSub {{"" "åäö -> HTML"} {"" "HTML -> åäö"}}
  493.  
  494. set htmlURLsSub {{"" "Clean Up…"} {"" "Clear"} {"" "Import…"} {"" "Export…"} {"" "Add Folder…"}
  495.     {"" "Add Selection"} {"" "Add Clipboard"}}
  496.  
  497. set htmlWindowsSub {{"" "Clean Up…"} {"" "Clear"}}
  498.  
  499. set htmlCheckSub {{"" "Check Window"} {"" "Check Home Page…"} {"" "Check Folder…"} {"" "Check File…"}
  500.     {"" "Check Remote Links"} "(-" {"" "Use Big Brother"}}
  501.  
  502. set htmlIncludesSub {{"" "Insert Include Tags…"} "(-" {"" "Update Window"} {"" "Update Home Page…"}
  503.     {"" "Update Folder…"} {"" "Update File…"}}
  504.  
  505. set htmlHomeSub {{"" Open…} {"<U<O/V" "Paste URL/Paste Include Tags"} {"" "Refresh Windows"}}
  506.  
  507. set htmlExtendSub {{"" "New Element…"} {"" "New Attributes…"} {"" "New Choices…"} {"" "Change Key Binding…"}
  508.     {"" "Change Type and Layout…"} {"" "Remove Attributes…"} {"" "Remove Additions…"}}
  509.  
  510. set htmlUtilSubMenus {Utilities Editing Validate {Character Translation} URLs Windows
  511. {Check Links} Includes {Home Page Windows} Extend}
  512.  
  513. #
  514. # The menu.
  515. #
  516. # <B = control <I = option <U = shift <O = command <S = dynamic
  517.  
  518. proc htmlBuildMenu {{msg "Building HTML menu…"}} {
  519.     global HTMLmodeVars htmlMenu
  520.     
  521.     html40.tcl
  522.     
  523.     if {[catch {htmlReadCache "HTML menu cache"}]} {
  524.         message $msg
  525.         htmlBuildMenu0
  526.     } else {
  527.         message "Reading HTML menu definition…"
  528.     }
  529.     insertMenu $htmlMenu
  530.  
  531.     htmlBrowsersMenuExtra
  532. }
  533.  
  534. proc htmlBuildMenu0 {} {
  535.     global htmlCustomMenuList modifiedModeVars htmlStartElements
  536.     global htmlMenu HTMLmodeVars htmlSmallCharsMenu
  537.     global htmlCapitalCharsMenu  htmlOtherChars1Menu htmlOtherChars2Menu
  538.     global htmlElemKeyBinding htmlMenuKey
  539.     global htmlSubMenus customHTMLpalettes
  540.     
  541.     set commonChars $HTMLmodeVars(commonChars)
  542.     # Build submenus
  543.     htmlReadMenuKeys
  544.     foreach me $htmlSubMenus {
  545.         set [lindex $me 0]Menu [htmlBuildOneMenu $me]
  546.     }
  547.     
  548.     
  549.     lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n Browsers $BrowsersMenu]
  550.     append htmlMenuList " " [lindex $HTMLMenu 0]
  551.     lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n Preferences $PreferencesMenu]
  552.     # add custom pallettes if any
  553.     if {[info exists customHTMLpalettes]} {
  554.         lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n Palettes $customHTMLpalettes]
  555.     }
  556.     lappend htmlMenuList [lindex $HTMLMenu 1] "(-" [lindex $HTMLMenu 2]
  557.     for {set i $htmlStartElements} {$i < [llength $htmlSubMenus]} {incr i} {
  558.         lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n [lindex $htmlSubMenus $i] [set [lindex [lindex $htmlSubMenus $i] 0]Menu]]
  559.     }
  560.     
  561.     # Allow user to insert custom menu items    
  562.     if {[info exists htmlElemKeyBinding]} {
  563.         foreach elem [lsort [array names htmlElemKeyBinding]] {
  564.             lappend customMenuList "$htmlElemKeyBinding($elem)[string range $elem 0 0][string tolower [string range $elem 1 end]]"
  565.         }
  566.         set htmlCustomMenu [list menu -M HTML -p htmlMenuItem -m -n "Custom" $customMenuList]
  567.         lappend htmlMenuList $htmlCustomMenu
  568.     }
  569.         
  570.     # Character entities
  571.     set htmlSmallCharMenu [list menu -M HTML -p htmlMenuItem -m -n "Small Chars" \
  572.     $htmlSmallCharsMenu]
  573.     set htmlCapCharsMenu [list menu -M HTML -p htmlMenuItem -m -c -n "Capital Chars" \
  574.     $htmlCapitalCharsMenu]
  575.     set htmlSymbCharsMenu1 [list menu -M HTML -p htmlMenuItem -m -n "Other Chars 1" $htmlOtherChars1Menu]
  576.     set htmlSymbCharsMenu2 [list menu -M HTML -p htmlMenuItem -m -n "Other Chars 2" $htmlOtherChars2Menu]
  577.     set tmp $commonChars
  578.     if {[llength $commonChars]} {lappend tmp "(-"}
  579.     lappend tmp Add… Default Clear $htmlSmallCharMenu $htmlCapCharsMenu $htmlSymbCharsMenu1 $htmlSymbCharsMenu2
  580.     set htmlCharsMenu [list menu -M HTML -p htmlMenuItem -m -n "Character Entities" $tmp]
  581.     lappend htmlMenuList $htmlCharsMenu
  582.     
  583.     # Define menu
  584.     menu -M HTML -m  -p htmlMenuItem -n $htmlMenu $htmlMenuList
  585.     
  586.     set h {menu -M HTML -m  -p htmlMenuItem -n $htmlMenu}
  587.     lappend h $htmlMenuList
  588.     htmlSaveCache "HTML menu cache" $h
  589.     catch {unset htmlMenuKey}
  590. }
  591.  
  592.  
  593. proc htmlRebuildMenu {msg} {
  594.     htmlDeleteCache "HTML menu cache"
  595.     htmlBuildMenu $msg
  596. }
  597.  
  598. # Add browsers to Browser menu
  599. proc htmlBrowsersMenuExtra {} {
  600.     global HTMLmodeVars browserSig modifiedModeVars htmlBrowsers
  601.     if {[lsearch -exact $HTMLmodeVars(browsers) $browserSig] < 0} {
  602.         lappend HTMLmodeVars(browsers) $browserSig
  603.         lappend modifiedModeVars {browsers HTMLmodeVars}
  604.     }
  605.     set htmlBrowsers {}
  606.     set tmpbrws {}
  607.     foreach brws $HTMLmodeVars(browsers) {
  608.         if {![catch {nameFromAppl $brws} name]} {
  609.             set name [file tail $name]
  610.             lappend htmlBrowsers [list $brws $name]
  611.             lappend tmpbrws $brws
  612.             htmlAddBrowserItem $name $brws
  613.             if {$brws == $browserSig} {markMenuItem -m "Browsers" $name on }
  614.         } else {
  615.             lappend modifiedModeVars {browsers HTMLmodeVars}
  616.         }
  617.     }
  618.     set HTMLmodeVars(browsers) $tmpbrws
  619. }
  620.  
  621. # Mark and disable some stuff
  622. proc htmlDisMark {} {
  623.     htmlDisableSome off
  624. }
  625.  
  626. proc htmlBuildUtilsMenu {{msg "Building HTML Utilities menu…"}} {
  627.     global htmlUtilsMenu
  628.  
  629.     if {[catch {htmlReadCache "HTML Utilities menu cache"}]} {
  630.         message $msg
  631.         htmlBuildUtilsMenu0
  632.     } else {
  633.         message "Reading HTML Utilities menu definition…"
  634.     }
  635.     insertMenu $htmlUtilsMenu
  636.     
  637.     htmlCharacterMenuExtra
  638.     htmlCheckMenuExtra
  639.     htmlURLsMenuExtra
  640.     htmlWindowsMenuExtra
  641.     htmlUtilDisMark
  642.  
  643. }
  644.  
  645. proc htmlRebuildUtilsMenu {msg} {
  646.     htmlDeleteCache "HTML Utilities menu cache"
  647.     htmlBuildUtilsMenu $msg
  648. }
  649.  
  650. proc htmlBuildUtilsMenu0 {} {
  651.     global htmlUtilSubMenus HTMLmodeVars htmlUtilsMenu htmlMenuKey
  652.     # Build submenus
  653.     htmlReadMenuKeys
  654.     foreach me $htmlUtilSubMenus {
  655.         set [lindex $me 0]Menu [htmlBuildOneMenu $me]
  656.     }
  657.  
  658.     foreach me [lrange $htmlUtilSubMenus 1 end] {
  659.         lappend utilSubs [list menu -M HTML -p htmlMenuItem -m -n $me [set [lindex $me 0]Menu]]
  660.     }
  661.     
  662.     menu -M HTML -p htmlMenuItem -m \
  663.     -n $htmlUtilsMenu [concat [lrange  $UtilitiesMenu 0 3] "(-" \
  664.     $utilSubs "(-" [lrange $UtilitiesMenu 4 end]]
  665.     
  666.     set h {menu -M HTML -p htmlMenuItem -m -n $htmlUtilsMenu}
  667.     lappend h [concat [lrange  $UtilitiesMenu 0 3] "(-" \
  668.     $utilSubs "(-" [lrange $UtilitiesMenu 4 end]]
  669.     htmlSaveCache "HTML Utilities menu cache" $h
  670.     catch {unset htmlMenuKey}
  671. }
  672.  
  673. # Add some things to translation menu.
  674. proc htmlCharacterMenuExtra {} {
  675.     addMenuItem -m -l "" "Character Translation" "<>& -> HTML"
  676.     addMenuItem -m -l "" "Character Translation" "HTML -> <>&"
  677. }
  678.  
  679. # Check if Big Brother exists and if it should be used.
  680. proc htmlCheckMenuExtra {} {
  681.     global HTMLmodeVars modifiedModeVars
  682.     if {[catch {nameFromAppl Bbth}]} {
  683.         enableMenuItem "Check Links" "Use Big Brother" off
  684.         enableMenuItem "Check Links" "Check Remote Links" off
  685.         if {$HTMLmodeVars(useBigBrother)} {
  686.             set HTMLmodeVars(useBigBrother) 0
  687.             lappend modifiedModeVars {useBigBrother HTMLmodeVars}
  688.         }
  689.     } elseif {$HTMLmodeVars(useBigBrother)} {
  690.         markMenuItem -m {Check Links} {Use Big Brother} 1 
  691.     }
  692. }
  693.  
  694. # Disable URLs menu if cache is empty.
  695. proc htmlURLsMenuExtra {} {
  696.     global HTMLmodeVars
  697.     if {![llength $HTMLmodeVars(URLs)]} {htmlEnableURLs off}
  698. }
  699.  
  700. # Disable Windows menu if cache is empty.
  701. proc htmlWindowsMenuExtra {} {
  702.     global HTMLmodeVars
  703.     if {![llength $HTMLmodeVars(windows)]} {htmlEnablewindows off}
  704. }
  705.  
  706. # Mark and disable some stuff
  707. proc htmlUtilDisMark {} {
  708.     htmlMarkExtUtil
  709. }
  710.  
  711. proc htmlSetDis {} {
  712.     global HTMLmodeVars htmlDisabledItems htmlDisabledExtensions htmlDisabledDeprecated
  713.     global htmlHideDeprecated htmlHideExtensions htmlHideFrames
  714.     set htmlDisabledItems ""
  715.     if {$htmlHideDeprecated || $HTMLmodeVars(hideDeprecated)} {
  716.         set htmlDisabledItems $htmlDisabledDeprecated
  717.     } elseif {$htmlHideExtensions || $HTMLmodeVars(hideExtensions)} {
  718.         set htmlDisabledItems $htmlDisabledExtensions
  719.     }
  720.     if {$htmlHideDeprecated} {
  721.         lappend htmlDisabledItems "Frames/Frameset" "Frames/Frame" "Frames/Inline Frame" "Frames/No Frames"
  722.     } elseif {$htmlHideFrames} {
  723.         lappend htmlDisabledItems "Frames/Frameset" "Frames/Frame"
  724.     }
  725. }
  726.  
  727. set htmlDisabledExtensions [list "Blocks and Dividers/Multi Column" \
  728.   "Blocks and Dividers/Spacing" "Blocks and Dividers/No Line Break" "Blocks and Dividers/Word Break" \
  729.   "Styles/Marquee" "Styles/Blinking" "Links/Sound" "${htmlMenu}/Plug-ins" \
  730.   "Forms/Key Generator" "Java and JavaScript/Server" "${htmlMenu}/Layers"]
  731.  
  732. set htmlDisabledDeprecated $htmlDisabledExtensions
  733. lappend htmlDisabledDeprecated "Java and JavaScript/Applet" "Styles/Font" "Styles/Basefont" \
  734.   "Blocks and Dividers/Center" "Lists/Directory" "Lists/Menu" "Other/Isindex" \
  735.   "Styles/Strike out" "Styles/Underlined"
  736. htmlSetDis
  737.